/* 

给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出和为目标值 target  的那两个整数，并返回它们的数组下标。

示例：
输入：nums = [2,7,11,15], target = 9
输出：[0,1]
解释：因为 nums[0] + nums[1] == 9 ，返回 [0, 1] 。

*/

/* 
思路1：暴力遍历
思路2：hash结构Map
*/
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
    // 思路1
    /* let res=[]
    for (let i = 0; i < nums.length; i++) {
        for (let j = i+1; j < nums.length; j++) {
            if(nums[i]+nums[j]==target){
                res[0]=i,
                res[1]=j
            }
        }
    }
    return res */
    
    // 思路2
    let map=new Map()
    for (let i = 0; i < nums.length; i++) {
        // 如果map中有和(target-当前值)相等的属性时
        if(map.has(target-nums[i])){
            // 返回[target-muns[i]对应的属性值(索引),当前索引]
            return [map.get(target-nums[i]),i]
        }else{
            // 把值作为map的属性存入
            map.set(nums[i],i)
        }
        
    }
};

/* 
思路1：
时间复杂度：O(N^2) 其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。

空间复杂度：O(1)。

思路2：
时间复杂度：O(N)，其中 N 是数组中的元素数量。对于每一个元素 x，我们可以 O(1) 地寻找 target - x。

空间复杂度：O(N)，其中 N 是数组中的元素数量。主要为哈希表的开销。

*/

// 运行
let nums = [2, 7, 11, 15], target = 9
let res = twoSum(nums, target)
console.log(res);